package com.songjia.stream.test02;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;

import com.songjia.stream.model.User;

/**
 * 
 * 
 * @Description: 用于接收来自RabbitMQ消息的消费者
 *
 * @author: songjia 
 * @date: 2018年3月23日 下午3:38:36
 */
/*
 * @EnableBinding：该注解用来指定一个或多个定义了@Input或@Output注解的接口，以此实现对消息通道（Channel）的绑定
 * @EnableBinding：开启绑定功能
 */
@EnableBinding(value = {Sink.class, SinkSender.class})
public class SinkReceiver {

	private static final Logger LOG = LoggerFactory.getLogger(SinkReceiver.class);

	
	/**
	 * @StreamListener("监听的消息通道名")：主要定义在方法上，作用是将被修饰的方法注册为消息中间件上数据流的事件监听器
	 * 
	 * 当输入消息通道中有消息到达的时候，会立即出发改注解修饰方法的处理逻辑对消息进行消费
	 * 
	 * @param payload
	 */
	@StreamListener(Sink.INPUT) // 监听名为“input”的通道，当该通道上接收到消息之后，将执行此方法进行消息消费
	public void receiveInput(Object payload) {
		LOG.info("Received: " + payload);
	}
	
	@StreamListener("input2") // 监听名为“input2”的通道，当该通道上接收到消息之后，将执行此方法进行消息消费
	public void receiveInput2(Object payload) {
		LOG.info("Received: " + payload);
	}
	
	@StreamListener("input3") // 监听名为“input3”的通道，当该通道上接收到消息之后，将执行此方法进行消息消费
	public void receiveInput3(User user) {
		LOG.info("Received: " + user);
	}
	
	

}